// copyright jyz.2024


#include "AbilitySystem/ModMagCalc/MMC_MaxHealth.h"

#include "AbilitySystem/AuraAttributeSet.h"
#include "Interaction/CombatInterface.h"

UMMC_MaxHealth::UMMC_MaxHealth()
{
	//捕获游戏属性
	VigorDef.AttributeToCapture = UAuraAttributeSet::GetVigorAttribute();
	//表示这个捕获定义的属性来源是目标对象。
	VigorDef.AttributeSource = EGameplayEffectAttributeCaptureSource::Target;
	
	// VigorDef.bSnapshot是一个布尔变量，决定了属性捕捉的行为方式。
	// 如果bSnapshot被设置为true，VigorDef作为快照（snapshot）保存下来。即使后续这个属性的值有所改变，这个快照的值也不会变化。
	// 如果bSnapshot被设置为false，VigorDef将不会在游戏效果被应用时立即记录属性值，而是在每次需要引用属性值时，都会获取目标对象"活力"属性的当前值。
	// 这意味着如果在游戏效果持续期间，这个属性值发生变化，这些变化将会被反映在游戏效果中。
	// 因此，VigorDef.bSnapshot = false; 这行代码是设置 VigorDef 的行为，让它在每次引用"活力"属性时总是获取其最新的值，而不是在游戏效果被应用时的初始值。
	VigorDef.bSnapshot = false;
	
	RelevantAttributesToCapture.Add(VigorDef);
}

float UMMC_MaxHealth::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const
{
	//从source 和 target 收集 Tags
	const FGameplayTagContainer* SourceTags = Spec.CapturedSourceTags.GetAggregatedTags();
	const FGameplayTagContainer* TargetTags = Spec.CapturedTargetTags.GetAggregatedTags();
	FAggregatorEvaluateParameters EvaluateParameters;
	EvaluateParameters.SourceTags = SourceTags;
	EvaluateParameters.TargetTags = TargetTags;
	//VigorValue：活力值
	float VigorValue = 0.f;
	GetCapturedAttributeMagnitude(VigorDef,Spec,EvaluateParameters,VigorValue);
	VigorValue = FMath::Max(VigorValue,0.f);
	ICombatInterface*CombatInterface = CastChecked<ICombatInterface>(Spec.GetContext().GetSourceObject());
	const int32 PlayerLevel = CombatInterface->GetCharacterLevel();
	return 100.f + 2.5f * VigorValue + 10.f * PlayerLevel;
	
}
